home *** CD-ROM | disk | FTP | other *** search
- PROGRAM maze;
- { This program will generate a maze on the screen of an IBM
- compatible PC. A different random number seed will produce a
- different maze.
-
- Written by James L. Dean
- 406 40th Street
- New Orleans, LA 70124
- February 11, 1986
- }
- {$I GRAPH.P}
- CONST
-
- num_columns = 79;
- num_rows = 49;
- num_cells = 3871; { num_columns*num_rows }
-
- { color assignments follow: }
-
- wall = 3; { wall must be positive }
- passage = 0; { wall, passage, new_path, and old_path must be different }
- new_path = 1;
- old_path = 2;
- solution = 2; { solution must be different from passage }
-
- VAR
- delta_index_1 : INTEGER;
- delta_index_2 : INTEGER;
- delta_x : ARRAY [1..21,1..2] OF INTEGER;
- delta_y : ARRAY [1..21,1..2] OF INTEGER;
- finished : BOOLEAN;
- magnitude_delta_x : INTEGER;
- magnitude_delta_y : INTEGER;
- old_path_found : BOOLEAN;
- passage_found : BOOLEAN;
- r_n : ARRAY [1..7] OF INTEGER;
- r_n_index_1 : INTEGER;
- r_n_index_2 : INTEGER;
- random_number : INTEGER;
- response : CHAR;
- seed : STRING[7];
- stack : ARRAY[1..num_cells] OF INTEGER;
- stack_index : INTEGER;
- tem_int_1 : INTEGER;
- tem_int_2 : INTEGER;
- x : INTEGER;
- x_initial_1 : INTEGER;
- x_initial_2 : INTEGER;
- x_max : INTEGER;
- x_next : INTEGER;
- x_previous : INTEGER;
- x_wall_1 : INTEGER;
- x_wall_2 : INTEGER;
- y : INTEGER;
- y_initial_1 : INTEGER;
- y_initial_2 : INTEGER;
- y_max : INTEGER;
- y_next : INTEGER;
- y_previous : INTEGER;
- y_wall_1 : INTEGER;
- y_wall_2 : INTEGER;
- BEGIN
- ClrScr;
- WRITE(OUTPUT,'Random number seed? ');
- READLN(INPUT,seed);
- magnitude_delta_x:=(319 DIV num_columns) DIV 2;
- magnitude_delta_y:=(199 DIV num_rows) DIV 2;
- x_max:=2*magnitude_delta_x*num_columns;
- y_max:=2*magnitude_delta_y*num_rows;
- WHILE (Length(seed) < 7) DO seed:=CONCAT('0',seed);
- FOR r_n_index_1:=1 TO 7 DO
- BEGIN
- tem_int_1:=ORD(seed[r_n_index_1]);
- WHILE (tem_int_1 > 23) DO tem_int_1:=tem_int_1-23;
- IF tem_int_1 = 0 THEN tem_int_1:=1;
- r_n[r_n_index_1]:=tem_int_1
- END;
- GraphColorMode;
- Draw(0,0,0,y_max,wall);
- Draw(0,y_max,x_max,y_max,wall);
- Draw(x_max,y_max,x_max,0,wall);
- Draw(x_max,0,0,0,wall);
- FillShape(magnitude_delta_x,magnitude_delta_y,passage,wall);
- x:=0;
- WHILE (x <= x_max) DO
- BEGIN
- Draw(x,0,x,y_max,wall);
- x:=x+magnitude_delta_x+magnitude_delta_x
- END;
- y:=0;
- WHILE (y <= y_max) DO
- BEGIN
- Draw(0,y,x_max,y,wall);
- y:=y+magnitude_delta_y+magnitude_delta_y
- END;
- FOR delta_index_1:=1 TO 10 DO
- BEGIN
- delta_x[delta_index_1,1]:=-magnitude_delta_x;
- delta_y[delta_index_1,1]:=0
- END;
- FOR delta_index_1:=11 TO 17 DO
- BEGIN
- delta_x[delta_index_1,1]:=0;
- delta_y[delta_index_1,1]:=magnitude_delta_y
- END;
- FOR delta_index_1:=18 TO 19 DO
- BEGIN
- delta_x[delta_index_1,1]:=magnitude_delta_x;
- delta_y[delta_index_1,1]:=0
- END;
- FOR delta_index_1:=20 TO 21 DO
- BEGIN
- delta_x[delta_index_1,1]:=0;
- delta_y[delta_index_1,1]:=-magnitude_delta_y
- END;
- FOR delta_index_1:=1 TO 21 DO
- BEGIN
- delta_x[delta_index_1,2]:=-delta_x[delta_index_1,1];
- delta_y[delta_index_1,2]:=-delta_y[delta_index_1,1]
- END;
- x_initial_1:=x_max-magnitude_delta_x;
- x_initial_2:=magnitude_delta_x;
- WHILE (x_initial_1 >= x_initial_2) DO
- BEGIN
- y_initial_1:=magnitude_delta_y;
- y_initial_2:=y_max-magnitude_delta_y;
- delta_index_2:=1;
- WHILE (y_initial_1 < y_max) DO
- BEGIN
- IF delta_index_2 = 1 THEN
- BEGIN
- x:=x_initial_1;
- y:=y_initial_1
- END
- ELSE
- BEGIN
- x:=x_initial_2;
- y:=y_initial_2
- END;
- IF GetDotColor(x,y) = passage THEN
- BEGIN
- FillShape(x,y,new_path,wall);
- finished:=FALSE;
- WHILE (NOT finished) DO
- BEGIN
- FOR delta_index_1:=1 TO 21 DO
- BEGIN
- REPEAT
- random_number:=r_n[1];
- r_n_index_1:=1;
- FOR r_n_index_2:=2 TO 7 DO
- BEGIN
- tem_int_1:=r_n[r_n_index_2];
- r_n[r_n_index_1]:=tem_int_1;
- random_number:=random_number+tem_int_1;
- IF random_number > 23 THEN
- random_number:=random_number-23;
- r_n_index_1:=r_n_index_2
- END;
- r_n[7]:=random_number
- UNTIL (random_number <= 21);
- tem_int_1:=delta_x[delta_index_1,delta_index_2];
- tem_int_2:=delta_x[random_number,delta_index_2];
- delta_x[delta_index_1,delta_index_2]:=tem_int_2;
- delta_x[random_number,delta_index_2]:=tem_int_1;
- tem_int_1:=delta_y[delta_index_1,delta_index_2];
- tem_int_2:=delta_y[random_number,delta_index_2];
- delta_y[delta_index_1,delta_index_2]:=tem_int_2;
- delta_y[random_number,delta_index_2]:=tem_int_1
- END;
- delta_index_1:=1;
- passage_found:=FALSE;
- WHILE ((delta_index_1 <= 21)
- AND (NOT passage_found)) DO
- BEGIN
- x_next:=x+2*delta_x[delta_index_1,delta_index_2];
- y_next:=y+2*delta_y[delta_index_1,delta_index_2];
- IF x_next < 0 THEN
- delta_index_1:=delta_index_1+1
- ELSE
- IF x_next > x_max THEN
- delta_index_1:=delta_index_1+1
- ELSE
- IF y_next < 0 THEN
- delta_index_1:=delta_index_1+1
- ELSE
- IF y_next > y_max THEN
- delta_index_1:=delta_index_1+1
- ELSE
- IF GetDotColor(x_next,y_next) = passage THEN
- passage_found:=TRUE
- ELSE
- delta_index_1:=delta_index_1+1
- END;
- IF passage_found THEN
- BEGIN
- FillShape(x_next,y_next,new_path,wall);
- IF delta_x[delta_index_1,delta_index_2] = 0 THEN
- BEGIN
- y_wall_1:=y+delta_y[delta_index_1,delta_index_2];
- x_wall_1:=x-magnitude_delta_x+1;
- x_wall_2:=x+magnitude_delta_x-1;
- Draw(x_wall_1,y_wall_1,x_wall_2,y_wall_1,new_path)
- END
- ELSE
- BEGIN
- y_wall_1:=y-magnitude_delta_y+1;
- y_wall_2:=y+magnitude_delta_y-1;
- x_wall_1:=x+delta_x[delta_index_1,delta_index_2];
- Draw(x_wall_1,y_wall_1,x_wall_1,y_wall_2,new_path)
- END;
- x:=x_next;
- y:=y_next
- END
- ELSE
- BEGIN
- delta_index_1:=1;
- old_path_found:=FALSE;
- WHILE ((delta_index_1 <= 21)
- AND (NOT old_path_found)) DO
- BEGIN
- x_next:=x+2*delta_x[delta_index_1,delta_index_2];
- y_next:=y+2*delta_y[delta_index_1,delta_index_2];
- IF x_next < 0 THEN
- delta_index_1:=delta_index_1+1
- ELSE
- IF x_next > x_max THEN
- delta_index_1:=delta_index_1+1
- ELSE
- IF y_next < 0 THEN
- delta_index_1:=delta_index_1+1
- ELSE
- IF y_next > y_max THEN
- delta_index_1:=delta_index_1+1
- ELSE
- IF GetDotColor(x_next,y_next)
- = old_path THEN
- old_path_found:=TRUE
- ELSE
- delta_index_1:=delta_index_1+1
- END;
- FillShape(x,y,old_path,wall);
- IF old_path_found THEN
- BEGIN
- IF delta_x[delta_index_1,delta_index_2] = 0 THEN
- BEGIN
- y_wall_1
- :=y+delta_y[delta_index_1,delta_index_2];
- x_wall_1:=x-magnitude_delta_x+1;
- x_wall_2:=x+magnitude_delta_x-1;
- Draw(
- x_wall_1,y_wall_1,x_wall_2,y_wall_1,old_path)
- END
- ELSE
- BEGIN
- y_wall_1:=y-magnitude_delta_y+1;
- y_wall_2:=y+magnitude_delta_y-1;
- x_wall_1
- :=x+delta_x[delta_index_1,delta_index_2];
- Draw(
- x_wall_1,y_wall_1,x_wall_1,y_wall_2,old_path)
- END
- END;
- finished:=TRUE
- END
- END
- END;
- delta_index_2:=delta_index_2+1;
- IF delta_index_2 > 2 THEN
- BEGIN
- delta_index_2:=1;
- y_initial_1:=y_initial_1+magnitude_delta_y+magnitude_delta_y;
- y_initial_2:=y_initial_2-magnitude_delta_y-magnitude_delta_y
- END
- END;
- x_initial_1:=x_initial_1-magnitude_delta_x-magnitude_delta_x;
- x_initial_2:=x_initial_2+magnitude_delta_x+magnitude_delta_x
- END;
- x:=magnitude_delta_x;
- y:=num_rows*magnitude_delta_y;
- tem_int_1:=num_rows DIV 2;
- tem_int_1:=num_rows-2*tem_int_1;
- IF tem_int_1 = 0 THEN y:=y-magnitude_delta_y;
- y_wall_1:=y-magnitude_delta_y+1;
- y_wall_2:=y+magnitude_delta_y-1;
- FillShape(x,y,passage,wall);
- WHILE (x < x_max) DO
- BEGIN
- x_next:=x+magnitude_delta_x+magnitude_delta_x;
- IF x_next < x_max THEN
- BEGIN
- IF GetDotColor(x_next,y) <> passage THEN
- BEGIN
- FillShape(x_next,y,passage,wall);
- x_wall_1:=x+magnitude_delta_x;
- Draw(x_wall_1,y_wall_1,x_wall_1,y_wall_2,passage)
- END
- END;
- x:=x_next
- END;
- x:=x_max-magnitude_delta_x;
- WHILE (x > 0) DO
- BEGIN
- x_wall_1:=x-magnitude_delta_x+1;
- x_wall_2:=x+magnitude_delta_x-1;
- y:=magnitude_delta_y;
- passage_found:=FALSE;
- WHILE ((y < y_max) AND (NOT passage_found)) DO
- IF GetDotColor(x,y) = passage THEN
- passage_found:=TRUE
- ELSE
- y:=y+magnitude_delta_y+magnitude_delta_y;
- y:=y-magnitude_delta_y-magnitude_delta_y;
- WHILE (y > 0) DO
- BEGIN
- IF GetDotColor(x,y) <> passage THEN
- BEGIN
- FillShape(x,y,passage,wall);
- y_wall_1:=y+magnitude_delta_y;
- Draw(x_wall_1,y_wall_1,x_wall_2,y_wall_1,passage)
- END;
- y:=y-magnitude_delta_y-magnitude_delta_y
- END;
- x:=x-magnitude_delta_x-magnitude_delta_x
- END;
- x:=magnitude_delta_x;
- WHILE (x < x_max) DO
- BEGIN
- x_wall_1:=x-magnitude_delta_x+1;
- x_wall_2:=x+magnitude_delta_x-1;
- y:=magnitude_delta_y;
- passage_found:=FALSE;
- WHILE ((y < y_max) AND (NOT passage_found)) DO
- IF GetDotColor(x,y) = passage THEN
- passage_found:=TRUE
- ELSE
- y:=y+magnitude_delta_y+magnitude_delta_y;
- y:=y+magnitude_delta_y+magnitude_delta_y;
- WHILE (y < y_max) DO
- BEGIN
- IF GetDotColor(x,y) <> passage THEN
- BEGIN
- FillShape(x,y,passage,wall);
- y_wall_1:=y-magnitude_delta_y;
- Draw(x_wall_1,y_wall_1,x_wall_2,y_wall_1,passage)
- END;
- y:=y+magnitude_delta_y+magnitude_delta_y
- END;
- x:=x+magnitude_delta_x+magnitude_delta_x
- END;
- Draw(1,0,2*magnitude_delta_x-1,0,passage);
- Draw(x_max-2*magnitude_delta_x+1,y_max,x_max-1,y_max,passage);
- Sound(440);
- Delay(1000);
- NoSound;
- REPEAT UNTIL KeyPressed;
- READ(KBD,response);
- IF ((response = 'S') OR (response = 's')) THEN
- BEGIN
- delta_x[1,1]:=magnitude_delta_x;
- delta_y[1,1]:=0;
- delta_x[2,1]:=0;
- delta_y[2,1]:=magnitude_delta_y;
- delta_x[3,1]:=-magnitude_delta_x;
- delta_y[3,1]:=0;
- delta_x[4,1]:=0;
- delta_y[4,1]:=-magnitude_delta_y;
- x:=magnitude_delta_x;
- y:=magnitude_delta_y;
- x_previous:=x;
- y_previous:=-y;
- Draw(x,0,x,y,solution);
- stack_index:=0;
- REPEAT
- delta_index_1:=1;
- passage_found:=FALSE;
- REPEAT
- WHILE ((delta_index_1 <= 4) AND (NOT passage_found)) DO
- BEGIN
- x_next:=x+delta_x[delta_index_1,1];
- y_next:=y+delta_y[delta_index_1,1];
- IF GetDotColor(x_next,y_next) = passage THEN
- passage_found:=TRUE
- ELSE
- delta_index_1:=delta_index_1+1
- END;
- IF (NOT passage_found) THEN
- BEGIN
- delta_index_1:=stack[stack_index];
- x_previous:=x-2*delta_x[delta_index_1,1];
- y_previous:=y-2*delta_y[delta_index_1,1];
- Draw(x,y,x_previous,y_previous,passage);
- x:=x_previous;
- y:=y_previous;
- stack_index:=stack_index-1;
- delta_index_1:=delta_index_1+1
- END
- UNTIL (passage_found);
- x_next:=x_next+delta_x[delta_index_1,1];
- y_next:=y_next+delta_y[delta_index_1,1];
- IF y_next <= y_max THEN
- BEGIN
- stack_index:=stack_index+1;
- stack[stack_index]:=delta_index_1;
- Draw(x,y,x_next,y_next,solution);
- x:=x_next;
- y:=y_next
- END
- UNTIL (y_next > y_max);
- Draw(x,y,x,y_max,solution);
- Sound(440);
- Delay(1000);
- NoSound;
- REPEAT UNTIL KeyPressed;
- READ(KBD,response)
- END;
- TextMode
- END.